﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
using DynaSpace.Entity;
using DynaSpace.Input;

namespace DynaSpace
{
	/// <summary>
	/// Hlavní herní třída DynaSpace
	/// </summary>
	public sealed partial class DynaGame
	{
		// stavy kláves
		// 0 = nestisknuto
		// 1 = stisknuto, ale klávesa byla již použita
		// 2 = nově stisknuto, klávesa nebyla zatím využita
		byte[] keyState = new byte[256];
		
		/// <summary>
		/// Updatuje stav klávesnice
		/// </summary>
		internal void UpdateKeyboard()
		{
			// zjistit stav klávesnice
			KeyboardState kbstate = Keyboard.GetState();

			// detekovat uvolněné klávesy
			for (int i = 0; i < 256; i++)
			{
				// vynulovat stav kláves, které jsou označené jako stisknuté, ale již stisknuté nejsou
				if(keyState[i] != 0 && !kbstate.IsKeyDown((Keys)i))
				{
					keyState[i] = 0;
				}
			}

			// projít stisknuté klávesy a nově stisknuté doplnit do seznamu
			foreach (Keys key in kbstate.GetPressedKeys())
			{
				int keyCode = (byte)key;

				if (keyState[keyCode] == 0)
					keyState[keyCode] = 2;
			}
		}

		/// <summary>
		/// Zjištuje, zda je klávesa stiknutá a zatím nepoužitá
		/// </summary>
		/// <param name="player">Hráč</param>
		/// <param name="button">Virtuální klávesa</param>
		/// <returns>True pro stisknutou klávesu</returns>
		public bool IsKeyPressed(PlayerIndex player, PlayerButton button)
		{
			byte keyCode = (byte)ControlBinder.GetKey(player, button);
			bool retVal = keyState[keyCode] == 2;
			return retVal;
		}

		/// <summary>
		/// Zjištuje, zda je klávesa stiknutá a zatím nepoužitá. Pokud vrátí True, nastaví klávesu na použitou.
		/// </summary>
		/// <param name="player">Hráč</param>
		/// <param name="button">Virtuální klávesa</param>
		/// <returns>True pro stisknutou klávesu</returns>
		public bool IsKeyPressedOnce(PlayerIndex player, PlayerButton button)
		{
			byte keyCode = (byte)ControlBinder.GetKey(player, button);
			bool retVal = keyState[keyCode] == 2;
			if (retVal) // zrušit stisk
				keyState[keyCode] = 1;
			return retVal;
		}
	}
}
